home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #5 & #6 / Amiga Plus CD - 1995 - No. 5 and 6.iso / pd / netz / magplip / source / track.c < prev   
C/C++ Source or Header  |  1995-08-20  |  4KB  |  158 lines

  1. /*
  2. ** $VER: track.c 1.2 (20 Aug 1995)
  3. **
  4. ** magplip.device - Parallel Line Internet Protocol
  5. **
  6. ** Original code written by Oliver Wagner and Michael Balzer.
  7. **
  8. ** This version has been completely reworked by Marius Gröger,
  9. ** introducing slight protocol changes. The new source is
  10. ** a lot better organized and maintainable.
  11. **
  12. ** (C) Copyright 1993-1994 Oliver Wagner & Michael Balzer
  13. ** (C) Copyright 1995 Marius Gröger
  14. **     All Rights Reserved
  15. **
  16. ** $HISTORY:
  17. **
  18. ** 05 Mar 1995 : 001.001 :  couldn't any longer stand the original, unstructured code
  19. ** 12 Feb 1995 : 001.000 :  reworked original
  20. */
  21.  
  22. /*F*/ /* includes */
  23. #ifndef CLIB_EXEC_PROTOS_H
  24. #include <clib/exec_protos.h>
  25. #include <pragmas/exec_sysbase_pragmas.h>
  26. #endif
  27.  
  28. #ifndef EXEC_MEMORY_H
  29. #include <exec/memory.h>
  30. #endif
  31. #ifndef EXEC_LISTS_H
  32. #include <exec/lists.h>
  33. #endif
  34. #ifndef EXEC_NODES_H
  35. #include <exec/nodes.h>
  36. #endif
  37.  
  38. #ifndef _STRING_H
  39. #include <string.h>
  40. #endif
  41.  
  42. #ifndef __MAGPLIP_H
  43. #include "magplip.h"
  44. #endif
  45.  
  46. #ifndef __DEBUG_H
  47. #include "debug.h"
  48. #endif
  49.  
  50. /*E*/
  51.  
  52. /*F*/ /* exports */
  53. extern BOOL addtracktype(BASEPTR, ULONG type);
  54. extern BOOL remtracktype(BASEPTR, ULONG type);
  55. extern VOID dotracktype(BASEPTR, ULONG type, ULONG ps, ULONG pr, ULONG bs, ULONG br, ULONG pd);
  56. extern BOOL gettrackrec(BASEPTR, ULONG type, APTR info);
  57. extern VOID freetracktypes(BASEPTR);
  58. /*E*/
  59.  
  60. /*F*/ /* statics */
  61. static struct TrackRec *findtracktype(BASEPTR, ULONG type);
  62. /*E*/
  63.  
  64. /*F*/ static struct TrackRec *findtracktype(BASEPTR, ULONG type)
  65. {
  66.    struct TrackRec * tr;
  67.  
  68.    for (tr = (struct TrackRec *) pb->pb_TrackList.lh_Head; tr->tr_Link.mln_Succ;
  69.                                                       tr = (struct TrackRec *) tr->tr_Link.mln_Succ)
  70.    {
  71.       if( tr->tr_PacketType == type )
  72.          return( tr );
  73.    }
  74.  
  75.    return( NULL );
  76. }
  77. /*E*/
  78. /*F*/ extern BOOL addtracktype(BASEPTR, ULONG type)
  79. {
  80.    struct TrackRec *tr;
  81.    BOOL rv = FALSE;
  82.  
  83.    ObtainSemaphore(&pb->pb_TrackListSem);
  84.    if (!(tr = findtracktype(pb, type)))
  85.    {
  86.       if (tr = AllocVec(sizeof(*tr), MEMF_CLEAR))
  87.       {
  88.          tr->tr_PacketType = type;
  89.          AddTail((struct List*)&pb->pb_TrackList, (struct Node *)tr);
  90.          rv = TRUE;
  91.       }
  92.    }
  93.    ReleaseSemaphore(&pb->pb_TrackListSem);
  94.  
  95.    return rv;
  96. }
  97. /*E*/
  98. /*F*/ extern BOOL remtracktype(BASEPTR, ULONG type)
  99. {
  100.    struct TrackRec *tr;
  101.    BOOL rv = FALSE;
  102.  
  103.    ObtainSemaphore( &pb->pb_TrackListSem );
  104.    if (tr = findtracktype(pb, type))
  105.    {
  106.       Remove((struct Node *)tr);
  107.       FreeVec(tr);
  108.       rv = TRUE;
  109.    }
  110.    ReleaseSemaphore( &pb->pb_TrackListSem );
  111.  
  112.    return rv;
  113. }
  114. /*E*/
  115. /*F*/ extern VOID dotracktype(BASEPTR, ULONG type, ULONG ps, ULONG pr, ULONG bs, ULONG br, ULONG pd)
  116. {
  117.    struct TrackRec * tr;
  118.  
  119.    ObtainSemaphore(&pb->pb_TrackListSem);
  120.    if (tr = findtracktype(pb, type))
  121.    {
  122.       tr->tr_Sana2PacketTypeStats.PacketsSent += ps;
  123.       tr->tr_Sana2PacketTypeStats.PacketsReceived += pr;
  124.       tr->tr_Sana2PacketTypeStats.BytesSent += bs;
  125.       tr->tr_Sana2PacketTypeStats.BytesReceived += br;
  126.       tr->tr_Sana2PacketTypeStats.PacketsDropped += pd;
  127.    }
  128.    ReleaseSemaphore(&pb->pb_TrackListSem);
  129. }
  130. /*E*/
  131. /*F*/ extern BOOL gettrackrec(BASEPTR, ULONG type, APTR info)
  132. {
  133.    struct TrackRec * tr;
  134.    BOOL rv = FALSE;
  135.  
  136.    ObtainSemaphoreShared( &pb->pb_TrackListSem );
  137.    if (tr = findtracktype(pb, type))
  138.    {
  139.       memcpy(info, &tr->tr_Sana2PacketTypeStats, sizeof(tr->tr_Sana2PacketTypeStats));
  140.       rv = TRUE;
  141.    }
  142.    ReleaseSemaphore( &pb->pb_TrackListSem );
  143.  
  144.    return rv;
  145. }
  146. /*E*/
  147. /*F*/ extern VOID freetracktypes(BASEPTR)
  148. {
  149.    struct Node *tr;
  150.  
  151.    ObtainSemaphore(&pb->pb_TrackListSem);
  152.    while(tr = RemHead((struct List*)&pb->pb_TrackList))
  153.       FreeVec(tr);
  154.    ReleaseSemaphore(&pb->pb_TrackListSem);
  155. }
  156. /*E*/
  157.  
  158.